package com.xuyaxu.rabbitmq.simple;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 简单消息模型（生产者）
 *
 * @author xyx
 * @date 2021/3/29 13:56
 */
public class SimpleSend {

    /**
     * 队列名称
     */
    private static final String QUEUE_NAME = "test_simple_queue";

    /**
     * 生产者和消费者共同的代码（可以集成为工具类）
     * 1.定义rabbitmq连接工厂（url、虚拟仓库、用户名和密码）
     * 2.获取连接
     * 3.建立通道
     *
     * @param args 参数
     */

    public static void main(String[] args) throws Exception {
        // 1.定义连接（rabbitmq）工厂
        ConnectionFactory factory = new ConnectionFactory();
        // 设置服务器地址
        factory.setHost("127.0.0.1");
        // 设置服务器端口
        factory.setPort(5672);
        // 设置虚拟仓库名
        factory.setVirtualHost("my_vhost");
        // 设置用户名
        factory.setUsername("guest");
        // 设置密码
        factory.setPassword("guest");
        // 2.通过工厂获取连接
        Connection connection = factory.newConnection();
        // 3.从连接中创建通道，使用通道才能完成消息相关的操作
        Channel channel = connection.createChannel();

        // 4.声明（创建）队列，参数：队列名称  是否声明为持久队列  是否声明为排他队列  是否声明为自动删除队列  队列的其他参数
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        // 5.添加消息内容
        String message = "Hello World!";
        // 6.向指定队列中发送消息，参数：交换机名称  路由键  消息的属性  消息的内容。此时使用的是默认的交换机
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());

        // 打印发送的消息内容
        System.out.println("【simple】生产者‘" + message + "'");

        // 7.关闭通道和连接
        channel.close();
        connection.close();
    }
}
